#pragma once

#include <QObject>
#include <QHash>
#include <QString>
#include <QIcon>
#include <functional>

class DockingArea;
class DockTab;
class QWidget;

/**
 * 标签页生成信息
 */
struct TabSpawnInfo {
    QString tabId;                              // 唯一标识符
    QString displayName;                        // 显示名称
    QIcon icon;                                // 图标
    std::function<QWidget*()> contentFactory;  // 内容创建工厂
    bool isSingleton = false;                  // 是否单例（只能有一个实例）
    bool canMoveToSidebar = false;             // 是否可移动到侧边栏
    bool isClosable = true;                    // 是否可关闭
};

/**
 * TabManager - 全局标签页管理器
 * 管理整个应用程序的标签页生命周期和布局
 */
class TabManager : public QObject {
    Q_OBJECT
    
public:
    explicit TabManager(QObject* parent = nullptr);
    ~TabManager();
    
    // === 停靠区域管理 ===
    void setPrimaryArea(DockingArea* area);
    DockingArea* primaryArea() const { return m_primaryArea; }
    
    // === 标签页类型注册 ===
    void registerTabSpawner(const TabSpawnInfo& info);
    void unregisterTabSpawner(const QString& tabId);
    bool isTabTypeRegistered(const QString& tabId) const;
    
    // === 标签页生成 ===
    DockTab* spawnTab(const QString& tabId, bool forceNew = false);
    DockTab* spawnTabInArea(const QString& tabId, DockingArea* area, bool forceNew = false);
    
    // === 标签页查找 ===
    DockTab* findExistingTab(const QString& tabId) const;
    QList<DockTab*> findAllTabsOfType(const QString& tabId) const;
    QList<DockTab*> getAllActiveTabs() const;
    
    // === 布局管理 ===
    void saveLayout(const QString& layoutName);
    void loadLayout(const QString& layoutName);
    void resetToDefaultLayout();

signals:
    void tabSpawned(DockTab* tab, const QString& tabId);
    void tabClosed(DockTab* tab, const QString& tabId);
    void layoutSaved(const QString& layoutName);
    void layoutLoaded(const QString& layoutName);

private:
    // === 内部辅助方法 ===
    DockTab* activateExistingTab(const QString& tabId);
    void activateExistingTab(DockTab* tab);
    DockTab* createTabFromInfo(const TabSpawnInfo& info);
    DockTab* createTabFromInfo(const TabSpawnInfo& info, DockingArea* area);
    QString getTabId(DockTab* tab) const;
    void createDefaultLayout();
    
    DockingArea* m_primaryArea;
    QHash<QString, TabSpawnInfo> m_tabSpawners;
    QHash<QString, DockTab*> m_singletonTabs;  // 单例标签页缓存
};

